home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / blackfin / include / asm / checksum.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.5 KB  |  101 lines

  1. #ifndef _BFIN_CHECKSUM_H
  2. #define _BFIN_CHECKSUM_H
  3.  
  4. /*
  5.  * MODIFIED FOR BFIN April 30, 2001 akbar.hussain@lineo.com
  6.  *
  7.  * computes the checksum of a memory block at buff, length len,
  8.  * and adds in "sum" (32-bit)
  9.  *
  10.  * returns a 32-bit number suitable for feeding into itself
  11.  * or csum_tcpudp_magic
  12.  *
  13.  * this function must be called with even lengths, except
  14.  * for the last fragment, which may be odd
  15.  *
  16.  * it's best to have buff aligned on a 32-bit boundary
  17.  */
  18. __wsum csum_partial(const void *buff, int len, __wsum sum);
  19.  
  20. /*
  21.  * the same as csum_partial, but copies from src while it
  22.  * checksums
  23.  *
  24.  * here even more important to align src and dst on a 32-bit (or even
  25.  * better 64-bit) boundary
  26.  */
  27.  
  28. __wsum csum_partial_copy(const void *src, void *dst,
  29.                    int len, __wsum sum);
  30.  
  31. /*
  32.  * the same as csum_partial_copy, but copies from user space.
  33.  *
  34.  * here even more important to align src and dst on a 32-bit (or even
  35.  * better 64-bit) boundary
  36.  */
  37.  
  38. extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
  39.                       int len, __wsum sum, int *csum_err);
  40.  
  41. #define csum_partial_copy_nocheck(src, dst, len, sum)    \
  42.     csum_partial_copy((src), (dst), (len), (sum))
  43.  
  44. __sum16 ip_fast_csum(unsigned char *iph, unsigned int ihl);
  45.  
  46. /*
  47.  *    Fold a partial checksum
  48.  */
  49.  
  50. static inline __sum16 csum_fold(__wsum sum)
  51. {
  52.     while (sum >> 16)
  53.         sum = (sum & 0xffff) + (sum >> 16);
  54.     return ((~(sum << 16)) >> 16);
  55. }
  56.  
  57. /*
  58.  * computes the checksum of the TCP/UDP pseudo-header
  59.  * returns a 16-bit checksum, already complemented
  60.  */
  61.  
  62. static inline __wsum
  63. csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
  64.            unsigned short proto, __wsum sum)
  65. {
  66.  
  67.     __asm__ ("%0 = %0 + %1;\n\t"
  68.          "CC = AC0;\n\t"
  69.          "if !CC jump 4;\n\t"
  70.          "%0 = %0 + %4;\n\t"
  71.          "%0 = %0 + %2;\n\t"
  72.          "CC = AC0;\n\t"
  73.                  "if !CC jump 4;\n\t"
  74.                  "%0 = %0 + %4;\n\t"
  75.           "%0 = %0 + %3;\n\t"
  76.          "CC = AC0;\n\t"
  77.                  "if !CC jump 4;\n\t"
  78.                  "%0 = %0 + %4;\n\t"
  79.                  "NOP;\n\t"
  80.           : "=d" (sum)
  81.          : "d" (daddr), "d" (saddr), "d" ((ntohs(len)<<16)+proto*256), "d" (1), "0"(sum));
  82.  
  83.     return (sum);
  84. }
  85.  
  86. static inline __sum16
  87. csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
  88.           unsigned short proto, __wsum sum)
  89. {
  90.     return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
  91. }
  92.  
  93. /*
  94.  * this routine is used for miscellaneous IP-like checksums, mainly
  95.  * in icmp.c
  96.  */
  97.  
  98. extern __sum16 ip_compute_csum(const void *buff, int len);
  99.  
  100. #endif                /* _BFIN_CHECKSUM_H */
  101.